package com.zhiyou100.interceptor;

import com.zhiyou100.entity.Worker;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

import static com.zhiyou100.interceptor.MyInterceptor.ResourcesEnum.*;


/**
 * 我的登陆拦截器拦截器
 *
 * @author yang
 * @version 1.0.0
 * @date 2020-08-31 23:32
 */
public class MyInterceptor implements HandlerInterceptor {
    /**
     * 在请求处理的方法之前执行
     * 如果返回true执行下一个拦截器
     * 如果返回false就不执行下一个拦截器
     *
     * @param request  request
     * @param response response
     * @param handler  对象
     * @return 如果返回true执行下一个拦截器  如果返回false就不执行下一个拦截器
     * @throws Exception 可能抛出异常
     */
    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 如果是登陆页面则放行
        System.out.println("uri: " + request.getRequestURI());

        final String url = request.getRequestURI();

        // 请求登陆地址或者登出地址，放行
        if (url.contains(LOGIN.getValue()) || url.contains(SING_OUT.getValue())) {
            return true;
        }

        HttpSession session = request.getSession();
        final Worker user = (Worker) session.getAttribute(USER.getValue());

        // 如果登陆，判断权限
        if (user != null) {
            // 权限值 1 2 3
            int wrose = user.getWrose();
            /*
            1 员工  不能员工增删改   不能角色增删改
            2 管理层  不能员工增删    不能角色分配
            3 boos  超级管理员：所有资源的使用权
             */
            switch (wrose) {
                case 1:
                    return employee(request, response, url);
                case 2:
                    return manage(request, response, url);
                case 3:
                    return true;
                default:
                    return other(request, response);
            }

        }

        // 用户没有登陆跳转到登陆页面
        request.getRequestDispatcher("/login.jsp").forward(request, response);
        return false;
    }


    private boolean employee(HttpServletRequest request, HttpServletResponse response, String url) throws ServletException, IOException {
        if (url.contains(USER.getValue()) || url.contains(ROSE.getValue())) {
            // 请求 员工和 角色的资源
            if (url.contains(INSERT.getValue()) || url.contains(DELETE.getValue()) || url.contains(UPDATE.getValue())) {
                // 包含 增删改，返回 false
                request.setAttribute("message", "员工  不能员工增删改   不能角色增删改");
                request.getRequestDispatcher("/404.jsp").forward(request, response);
                return false;
            } else {
                return true;
            }
        } else {
            return true;
        }
    }

    private boolean manage(HttpServletRequest request, HttpServletResponse response, String url) throws ServletException, IOException {
        if (url.contains(USER.getValue()) || url.contains(ROSE.getValue())) {
            // 请求 员工和 角色的资源
            if (url.contains(INSERT.getValue()) || url.contains(DELETE.getValue()) || url.contains(UPDATE.getValue())) {
                // 包含 增删改，返回 false
                request.setAttribute("message", "管理层  不能员工增删    不能角色分配");
                request.getRequestDispatcher("/404.jsp").forward(request, response);
                return false;
            } else {
                return true;
            }
        } else {
            return true;
        }
    }

    private boolean other(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setAttribute("message", "你啥也不是，没有权限,联系 boos 添加权限");
        request.getRequestDispatcher("/404.jsp").forward(request, response);
        return false;
    }


    /**
     * 在请求处理方法执行之后执行
     *
     * @param request      request
     * @param response     response
     * @param handler      handler
     * @param modelAndView 视图
     * @throws Exception 抛出异常
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //System.out.println("------------处理后------------");
    }

    /**
     * 在 dispatcherServlet t处理后执行,做清理工作.
     *
     * @param request  request
     * @param response response
     * @param handler  对象
     * @param ex       捕获到的异常
     * @throws Exception 抛出异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //System.out.println("------------清理------------");
    }

    enum ResourcesEnum {
        /**
         * 登陆
         */
        LOGIN("login"),

        /**
         * 登出
         */
        SING_OUT("signOut"),

        /**
         * 员工
         */
        USER("user"),
        /**
         * 角色
         */
        ROSE("rose"),
        /**
         * list
         */
        LIST("list"),
        /**
         * 获取一个
         */
        GET("get"),
        /**
         * 插入一个
         */
        INSERT("insert"),
        /**
         * 更新一个
         */
        UPDATE("update"),
        /**
         * 删除一个
         */
        DELETE("delete");

        private String value;

        ResourcesEnum(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

}